package com.yanggu.bigdata.realtime.utils

import cn.hutool.core.collection.CollUtil
import cn.hutool.core.date.DateUtil
import cn.hutool.core.util.StrUtil
import com.alibaba.fastjson.{JSON, JSONObject}
import com.yanggu.bigdata.realtime.common.GmallConfig.HBASE_SCHEMA
import org.apache.flink.api.common.time.Time


/**
 * 维度查询工具类
 */
object DimQueryUtil {

  /**
   * 通过id查询维度表信息
   * 先在redis中查询, redis中有直接返回
   * redis中没有, 从hbase中查询后设置到redis中, 然后返回
   *
   * @param tableName    表名
   * @param pkColumnName 主键字段名 默认为id
   * @param pkValue      主键字段值
   * @return
   */
  def getDimInfo(tableName: String, pkColumnName: String = "id", pkValue: String): JSONObject = {
    val jedis = RedisUtil.getJedis
    try {
      val redisKey = s"$HBASE_SCHEMA:$tableName:$pkValue"
      val redisDataStr = jedis.get(redisKey)
      if (StrUtil.isNotEmpty(redisDataStr)) {
        //重新设置失效时间
        //jedis.expire(redisKey, Time.days(1L).toMilliseconds / 1000)
        return JSON.parseObject(redisDataStr)
      }
      val sql = s"SELECT * FROM $tableName WHERE $pkColumnName = '$pkValue'"
      println(s"phoenix需要查询的sql: $sql")
      //获取首个, 如果List为null和空的, 返回null
      val data = CollUtil.getFirst(PhoenixUtil.queryList(sql, classOf[JSONObject]))
      if (data != null) {
        jedis.setex(redisKey, Time.days(1L).toMilliseconds / 1000, data.toJSONString)
      }
      data
    } catch {
      case exception: Exception =>
        exception.printStackTrace()
        throw new RuntimeException("维度查询发生异常")
    } finally {
      //finally代码块中jedis必须关闭
      jedis.close()
    }
  }

  def main(args: Array[String]): Unit = {
    //两次访问测试
    val timer = DateUtil.timer
    println(getDimInfo(tableName = "DIM_BASE_TRADEMARK", pkValue = "18").toJSONString)
    println(s"第一次查询耗费${timer.intervalRestart}毫秒")
    //测试存在的id
    println(getDimInfo(tableName = "DIM_BASE_TRADEMARK", pkValue = "18").toJSONString)
    println(s"第二次查询耗费${timer.interval()}毫秒")
  }

}
